package com.soar.tbox.util;

import java.util.ArrayList;
import java.util.List;

import com.soar.tbox.bean.Command;
import com.soar.tbox.bean.Paramter;

/**
 * 解析指令数据，把指令数据封装成Command对象
 * @author songjunjie
 *
 */
public class CommandAnalyzer {
	
	/**
	 * 解析下行指令数据
	 * @param data
	 * @return
	 */
	public static Command analyze(byte[] data){
		Command command = new Command();
		byte head = data[0];//指令头
		byte transmitFlag = data[1];//传输方向
		byte type = data[2];//业务类别
		byte commandNo = data[3];//指令编号
		byte year = data[4];//年
		byte[] time = new byte[4];//月日时分秒
		System.arraycopy(data, 5, time, 0, 4) ;
		byte statusFlag = data[9];//状态位
		byte markBit = data[10];//标志位
		//剩余部分的长度指令头+数据体的除了参数部分共11个字节。
		int remaining = data.length - 11;
		List<Paramter> paramList = new ArrayList<Paramter>();
		
		while(remaining > 0){
			byte pKey = data[11];//参数key
			byte[] pLen;//参数长度
			byte[] pValue;//参数值
			int len ;
			if(markBit == 0x80){//表示长参数模式。
				pLen = new byte[2];
				System.arraycopy(data, 12, pLen, 0, 2) ;
				len = Converts.uwordToInt(pLen);//参数长度
				pValue = new byte[len];
				System.arraycopy(data, 14, pValue, 0, len);
			}else{//否则为短参数模式
				pLen = new byte[]{data[12]};
				len = Converts.ubyteToInt(pLen[0]);
				pValue = new byte[len];
				System.arraycopy(data, 14, pValue, 0, len);
			}
			Paramter param = new Paramter();
			param.setKey(new byte[]{pKey});
			param.setLen(pLen);
			param.setValue(pValue);
			paramList.add(param);
			
			//当前正在读取的参数部分总长度
			int i = 1 + pLen.length + len;
			//剩余的未读取的参数长度
			remaining = remaining - i;
		}
		command.setHead(head);
		command.setTransmitFlag(transmitFlag);
		command.setType(type);
		command.setCommandNo(commandNo);
		command.setYear(year);
		command.setTime(time);
		command.setStatusFlag(statusFlag);
		command.setMarkBit(markBit);
		command.setParamList(paramList);
		return command;
	}
}
